package com.zenithmind.library.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.zenithmind.common.result.PageResult;
import com.zenithmind.common.result.Result;
import com.zenithmind.library.pojo.domain.Author;
import com.zenithmind.library.pojo.dto.AuthorCreateDTO;
import com.zenithmind.library.pojo.dto.AuthorUpdateDTO;
import com.zenithmind.library.pojo.query.AuthorQuery;
import com.zenithmind.library.pojo.vo.AuthorVO;

import java.util.List;

/**
 * 作者服务接口
 * 
 * @author ZenithMind
 * @since 2024-06-14
 */
public interface AuthorService extends IService<Author> {

    /**
     * 分页查询作者
     * 
     * @param query 查询条件
     * @return 分页结果
     */
    PageResult<AuthorVO> getAuthorPage(AuthorQuery query);

    /**
     * 根据ID获取作者详情
     * 
     * @param id 作者ID
     * @return 作者详情
     */
    AuthorVO getAuthorDetail(String id);

    /**
     * 创建作者
     * 
     * @param createDTO 创建DTO
     * @return 创建结果
     */
    Result<AuthorVO> createAuthor(AuthorCreateDTO createDTO);

    /**
     * 更新作者
     * 
     * @param id 作者ID
     * @param updateDTO 更新DTO
     * @return 更新结果
     */
    Result<AuthorVO> updateAuthor(String id, AuthorUpdateDTO updateDTO);

    /**
     * 删除作者
     * 
     * @param id 作者ID
     * @return 删除结果
     */
    Result<Void> deleteAuthor(String id);

    /**
     * 批量删除作者
     * 
     * @param ids 作者ID列表
     * @return 删除结果
     */
    Result<Void> batchDeleteAuthors(List<String> ids);

    /**
     * 启用作者
     * 
     * @param id 作者ID
     * @return 操作结果
     */
    Result<Void> enableAuthor(String id);

    /**
     * 禁用作者
     * 
     * @param id 作者ID
     * @return 操作结果
     */
    Result<Void> disableAuthor(String id);

    /**
     * 根据姓名查询作者
     * 
     * @param name 作者姓名
     * @return 作者列表
     */
    List<AuthorVO> getAuthorsByName(String name);

    /**
     * 根据图书ID查询作者
     * 
     * @param bookId 图书ID
     * @return 作者列表
     */
    List<AuthorVO> getAuthorsByBookId(String bookId);

    /**
     * 搜索作者
     * 
     * @param keyword 关键词
     * @param limit 限制数量
     * @return 作者列表
     */
    List<AuthorVO> searchAuthors(String keyword, Integer limit);

    /**
     * 获取热门作者
     * 
     * @param limit 限制数量
     * @return 热门作者列表
     */
    List<AuthorVO> getHotAuthors(Integer limit);

    /**
     * 获取高产作者
     * 
     * @param limit 限制数量
     * @return 高产作者列表
     */
    List<AuthorVO> getProductiveAuthors(Integer limit);

    /**
     * 更新作者作品数量
     * 
     * @param authorId 作者ID
     * @return 更新结果
     */
    Result<Void> updateAuthorBookCount(String authorId);

    /**
     * 增加作者作品数量
     * 
     * @param authorId 作者ID
     * @return 更新结果
     */
    Result<Void> incrementAuthorBookCount(String authorId);

    /**
     * 减少作者作品数量
     * 
     * @param authorId 作者ID
     * @return 更新结果
     */
    Result<Void> decrementAuthorBookCount(String authorId);

    /**
     * 更新作者总借阅次数
     * 
     * @param authorId 作者ID
     * @return 更新结果
     */
    Result<Void> updateAuthorTotalBorrowCount(String authorId);

    /**
     * 增加作者总借阅次数
     * 
     * @param authorId 作者ID
     * @return 更新结果
     */
    Result<Void> incrementAuthorTotalBorrowCount(String authorId);

    /**
     * 检查作者姓名是否存在
     * 
     * @param name 作者姓名
     * @param excludeId 排除的ID
     * @return 是否存在
     */
    boolean existsByName(String name, String excludeId);

    /**
     * 导入作者数据
     * 
     * @param authors 作者列表
     * @return 导入结果
     */
    Result<String> importAuthors(List<AuthorCreateDTO> authors);

    /**
     * 导出作者数据
     * 
     * @param query 查询条件
     * @return 导出文件路径
     */
    Result<String> exportAuthors(AuthorQuery query);
}
